/*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Copyright (c) 2023 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* This file has been modified by Huawei to verify type inference by adding verification statements.
*/

// === tests/cases/compiler/customAsyncIterator.ts ===
declare function AssertType(value:any, type:string):void;
// GH: https://github.com/microsoft/TypeScript/issues/33239
class ConstantIterator<T> implements AsyncIterator<T, undefined, T | undefined> {
    constructor(private constant: T) {
    }
    async next(value?: T): Promise<IteratorResult<T>> {
        if (value != null) {
AssertType(value != null, "boolean");
AssertType(value, "T");
AssertType(null, "null");

            throw new Error("ConstantIterator.prototype.next may not take any values");
AssertType(new Error("ConstantIterator.prototype.next may not take any values"), "Error");
AssertType(Error, "ErrorConstructor");
AssertType("ConstantIterator.prototype.next may not take any values", "string");
        }
AssertType({ value: this.constant, done: false }, "{ value: T; done: false; }");
AssertType(value, "T");
AssertType(this.constant, "T");
AssertType(this, "this");
AssertType(done, "boolean");
AssertType(false, "boolean");
        return { value: this.constant, done: false };
    }
}

